<?php

/**
 * Модель системных настроек
 */
class SettingsModel extends DbModel {

    protected $_name = 'config';

    /**
     * Получение настроек из БД
     *
     * @return <type>
     */
    public function getSettings() {
        $select = $this->select();
        $res = $this->_db->fetchPairs($select);
        return $res;
    }

    /**
     * Резервная копия БД
     *
     * @return string
     */
    public function backupDB() {
        $res = $this->_db->fetchAll("SHOW TABLES");
        $tables = array();
        $return = '';
        foreach ($res as $value) {//Получаем таблицы базы
            $t = each($value);
            $table = $t['value'];
            $result = $this->_db->fetchAll('SELECT * FROM `' . $table . '`');
            $return.= 'DROP TABLE IF EXISTS `' . $table . '`;';
            $row_obj = (array) $this->_db->fetchRow('SHOW CREATE TABLE `' . $table . '`');
            $return.= "\n\n" . $row_obj["Create Table"] . ";\n\n";
            foreach ($result as $value) {
                $return.= 'INSERT INTO `' . $table . '` VALUES(';
                $i = false;
                $row = $value;
                foreach ($row as $k => $v) {
                    if ($i) {
                        $return.= ',';
                    } else {
                        $i = true;
                    }
                    $val = addslashes($v);
                    $return.= '"' . $val . '"';
                }
                $return.= ");\n";
            }
        }
        $return.="\n\n\n";
        return $return;
    }

    public function restoreDB($time) {
        $filename = APP_PATH . '/backups/' . $time . '.sql';
        if (file_exists($filename)) {
            $handle = fopen($filename, "r");
            $sql = fread($handle, filesize($filename));
            fclose($handle);
            return $this->_db->getConnection()->exec($sql);
        } else {
            return false;
        }
    }

    public function getBackups() {
        $backups = array();
        if ($dir = opendir(APP_PATH . '/backups')) {
            while (false !== ($file = readdir($dir))) {
                if (pathinfo($file, PATHINFO_EXTENSION) && is_file(APP_PATH . '/backups/' . $file))
                    $backups[] = pathinfo($file, PATHINFO_FILENAME);
            }
            closedir($dir);
            asort($backups);
            return $backups;
        } else {
            return false;
        }
    }

    /**
     * Обновление настроек хранимых в БД
     *
     * @param array $array Новые настройки
     * @return mixed
     */
    public function updateSettings($array) {
        $select = $this->select();
        foreach ($array as $key => $value) {
            $res = $this->update(array('value' => "$value"), "`name` = '$key'");
        }
        return $res;
    }

    public function updateSystem($current, $update) {
        set_time_limit(600);
        
        //Загружаем дистрибутив, распаковываем его согласно PUBLIC_PATH & APP_PATH
        $distr = TMP_PATH . '/' . $update . '.zip';
        $handle = fopen($distr, "w+");
        $opts = array(
            'http' => array(
                'method' => "GET",
                'header' => "Accept-language: en\r\n" .
                "Cookie: foo=bar\r\n"
            )
        );

        $context = stream_context_create($opts);
        $file = file_get_contents("http://www.unlabeled.ru/downloads/" . $update . '.zip', false, $context);
        
        fwrite($handle, $file);
        fclose($handle);
        chmod($distr, 0664);
        $zip = zip_open($distr);
        while ($entry = zip_read($zip)) {

            $pathes = explode('/', zip_entry_name($entry));
            $target = array_shift($pathes);

            if ($target == 'app') {
                $ext = APP_PATH . '/' . implode('/', $pathes);
            } elseif ($target == 'public') {
                $ext = PUBLIC_PATH . '/' . implode('/', $pathes);
            }

            if (!file_exists(dirname($ext))) {
                mkdir(dirname($ext), 0775, true);
            }

            if (zip_entry_open($zip, $entry, "r")) {
                if (!is_dir($ext)) {
                    $fd = fopen($ext, 'w+');
                    fwrite($fd, zip_entry_read($entry, zip_entry_filesize($entry)));
                    chmod($ext, 0664);
                    fclose($fd);
                }
                zip_entry_close($entry);
            }
        }
        //Открываем папку app/updates и инклудим файлы начиная с текущей версии
        //выполняем функцию update, она возвращает обновленную версию
        //если она не равна текущей, инклудим файлы дальше
        if ($handle = opendir(APP_PATH . '/updates/')) {
            while (false !== ($entry = readdir($handle))) {
                if (file_exists(APP_PATH . '/updates/' . $current . '.php')) {
                    include_once APP_PATH . '/updates/' . $current . '.php';
                    $current = update($this);
                } else {
                    unlink($distr);
                    return true;
                }
            }
        }
        unlink($distr);
        return true;
    }

}